約 2,010,446 件
https://w.atwiki.jp/vst_prog/pages/85.html
VST Tips(準備中) 簡単な音源(VSTi)のについて ここではMIDIメッセージ処理(作成中)で作成したVSTを元に簡単な音源(VSTi)を作成する。 作成するに当たって、まずは音源の基本モデルとなるシンセサイザーの構成について記載する。 次に作成する音源(VSTi)について記載する。 なお、ここに記載している内容はシンセサイザーの用語(オシレーター、フィルター等)と三角関数についてある程度の知識があることを前提としている。 また、ここで作成するVSTiサンプルのソースコードはここにある シンセサイザーの構成 シンセサイザーの構成というと下記の図のようなシンセサイザーの音作りに関する部位がよくピックアップされる 実際にシンセサイザー(VSTi)を作成する際には上記のような音声信号に直接かかわる部位だけでなく、MIDIやオシレータ、パラメータを制御するさまざまなコントローラーが必要となる。(下記の図は参考例) 部位 説明 MIDI Controller 鍵盤やピッチベンド等からのMIDIメッセージの振り分けを行う。例:MIDI Note Onメッセージ→VoiceControllerへ転送、MIDI CC 74(ブライトネス)メッセージ→Parameter Controllerへ転送 など Voice Controller MIDI Note Onメッセージにより停止中のオシレーターを発音させたり、MIDI Note Offメッセージにより発音中のオシレータを停止させる。 Parameter Controller フィルタのカットオフ周波数の変更や、アンプリファイアのEnvelope Generatorの変更を行う Mixer 各Voice(Oscillator、Filter、Amplifierを1つにしたもの)からの出力を加算し、出力する また、上記のすべての機能をVSTiで実装する必要はない。 VSTiが処理を担当する部分、ホストアプリケーションが処理を担当する部分を示すと下記の図のようになる。 次へ 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vst_prog/pages/51.html
VSTエフェクタ作成例 Tips VST Tipsトップページ(準備中) Effector Tipsトップページ その他 リンク 管理者へのメール テストページ ここを編集
https://w.atwiki.jp/gdiplus2/pages/35.html
注意 FreeType について freetype.dllの入手GnuWin32 の freetype.dll を使う場合 GDI++専用 Uploader の freetype.dll を使う場合 注意 基本的に、新しいバージョンのものを使用します。 このページの情報は古い可能性があります。最新版の情報などは2chスレを各自追いましょう。 バージョン2.3.5以前に複数の欠陥。2.3.6で修正されています( http //secunia.com/advisories/30600/ )。 FreeType について Portions of this software are copyright (c) 2005-2007 The FreeType Project (www.freetype.org). All rights reserved. freetype.dllの入手 GnuWin32 の freetype.dll を使う場合 バージョン2.3.5以前で確認された複数の欠陥は2.3.6で修正されましたが、GnuWin32のFreeType2.3.6以降はまだないようです。 http //sourceforge.net/projects/gnuwin32/ GDI++専用 Uploader の freetype.dll を使う場合 gdi0869.7z FreeType2.3.7 gdi0866.zip FreeType2.3.6 gdi0856.zip FreeType2.3.5(?) / これ以前のバージョンには複数の欠陥が確認されています。 gdi0467(ft232.zip) gdi0434(ft231.zip) gdi0420(ft230.zip) gdi0299(freetype221.zip)
https://w.atwiki.jp/vst_prog/pages/80.html
トップページ MIDIメッセージを処理するVSTについて2 MIDIメッセージ処理 No1~No5で作成したVSTのMIDI処理については、どんなVSTでもほぼ共通の処理となる。 コードを再利用しやすいように、ここではシステムエクスクルーシブを除くMIDIメッセージに関する処理をクラスとしてひとまとめにする。 MIDIメッセージを処理するクラスは自作VSTクラスで下記のように継承できるように作成する。 class MyMidiSampleVST2 public AudioEffectX , public CMidiMsg // CMidiMsgが今回作成するクラス{: // 以下省略:}; ここで作成するVSTサンプルのソースコード全体はここにある。 MIDIメッセージ処理用クラス定義 MIDIメッセージ処理用クラスは以下のように定義する。(全体は長いので一部省略している。全体はここにある。) class CMidiMsg{protected int cur; //読み込み中のMIDIの位置int num; //受け取ったMIDIメッセージの数MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファpublic CMidiMsg(void);~CMidiMsg(void); // バッファのクリア等を行う。virtual void clearMidiMsg(); // MIDIメッセージをバッファに追加する// バッファへの追加が成功すると1、失敗すると0を返すvirtual int addMidiMsg(VstMidiEvent *midievent);virtual int addMidiMsg(MidiMessage msg); // バッファからMIDIメッセージを取り出すvirtual MidiMessage getMidiMsg(); // バッファ中にあるMIDIメッセージの数を返すvirtual VstInt32 getMidiMessageNum(); // バッファから最初に取り出せるMIDIメッセージのDeltaFramesを返すvirtual VstInt32 getNextDeltaFrames(); // MIDIメッセージが何かを判断し、そのメッセージに対応した// onMidiKeyOn()関数、onMidiControlChange()関数等を呼び出す。// 引数なしの場合、内部でgetMidiMsg()が使用されるので注意。virtual void midiProc(MidiMessage mididata);virtual void midiProc() { MidiMessage mididata = getMidiMsg(); midiProc(mididata); }; // midiProc()関数から呼び出される。// それぞれのMIDIメッセージに応じて処理を行う// 以下6つはオーバーライドして使うvirtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空: // 長いので省略:}; 解説 まず、MIDIメッセージのや書き込みのためのバッファと読み出し位置や書き込み位置の変数を定義している。 これらは他のクラスから読み込まれることはないのでprotectedで宣言している。 protected int cur; //読み込み中のMIDIの位置 int num; //受け取ったMIDIメッセージの数 MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファ 次に以下2つの操作を行うための関数を定義している ホストアプリケーションからのMIDIメッセージの受け取る際に使用する関数(processEvents()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 clearMidiMsg() なし なし MIDIメッセージを受け取るMIDIバッファを初期化する関数。 addMidiMsg() int VstMidiEvent *midievent MIDIメッセージをMIDIバッファへの保存する関数。引数は受け取るMIDIメッセージ(VstMidiEvent型のポインタ)MIDIバッファへの追加に成功すると1、失敗すると0が返る。 受け取ったMIDIメッセージを処理する関数(processReplacing()関数内で呼び出される関数) メンバ関数 戻り値 引数 内容 getMidiMessageNum() VstInt32 なし MIDIメッセージ有無のチェックに利用する関数。戻り値はMIDIバッファにあるMIDIメッセージの数。 getNextDeltaFrames() VstInt32 なし processReplacing()関数内で次のMIDIメッセージを処理するタイミングを返す関数。戻り値は処理すべきフレーム(0~sampleFramesの範囲の値) getMidiMsg() MidiMessage MIDIバッファからのMIDIメッセージの取り出す関数。戻り値はMIDIメッセージ構造体 midiProc()関数 なし MidiMessage mididata 引数のMIDIメッセージに応じて処理を実施する。引数は処理するMIDIメッセージ midiProc()関数では各MIDIメッセージ(KeyOn、KeyOff、ControlChange等)を処理するメンバ関数を呼び出す。 これらの関数(onMidiKeyOn()関数、onMidiKeyOff()関数 等)についても、定義している。 midiProc()関数から呼び出されるメンバ関数 メンバ関数 戻り値 引数 内容 onMidiKeyOn() なし MIDIメッセージがKeyOnの際に呼び出される。 onMidiKeyOff() なし MIDIメッセージがKeyOffの際に呼び出される。 onMidiProgramChange() なし MIDIメッセージがプログラムチェンジの際に呼び出される。 onMidiPoliKeyPress() なし MIDIメッセージがポリフォニックキープレッシャーの際に呼び出される。 onMidiChannelPress() なし MIDIメッセージがチャンネルプレッシャーの際に呼び出される。 onMidiPitchBend() なし MIDIメッセージがピッチベンドチェンジの際に呼び出される。 onMidiSystemMessage() なし MIDIメッセージがシステムコモンメッセージ、システムリアルタイムメッセージの際に呼び出される。システムメッセージに応じてさらにonMidiQuarterFrame()関数、onMidiSongPointer()関数などが呼び出される onMidiControlChange() なし MIDIメッセージがコントロールチェンジの際に呼び出される。コントロールチェンジメッセージに応じてさらにonMidiCC000()~onMidiCC127()の関数が呼び出される。 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/79.html
トップページ MIDIメッセージ処理(改良版) MIDIメッセージにあわせて動作するVSTのサンプルの改良版である。 下記VSTはSynthとしてロードされ、常にノイズを発生させる。実行時は音量に注意してほしい。 ノイズのボリュームをMIDI CC7でコントロールできる。 サンプルコード全体 【CMidiMsg.h】 #pragma once#include string.h #include "audioeffectx.h" // ============================================================================================// MIDI処理用の定義// ============================================================================================#define MIDIMSG_MAXNUM 255 struct MidiMessage{VstInt32 deltaFrames; //MIDIメッセージを処理するタイミングunsigned char message; //MIDIメッセージ番号unsigned char channel; //MIDIチャンネルunsigned char data1; //MIDIデータ1unsigned char data2; //MIDIデータ2}; class CMidiMsg{protected int cur; //読み込み中のMIDIの位置int num; //受け取ったMIDIメッセージの数MidiMessage buf[MIDIMSG_MAXNUM]; //受け取ったMIDIメッセージを保管するバッファpublic CMidiMsg(void);~CMidiMsg(void); // バッファのクリア等を行う。virtual void clearMidiMsg(); // MIDIメッセージをバッファに追加する// バッファへの追加が成功すると1、失敗すると0を返すvirtual int addMidiMsg(VstMidiEvent *midievent);virtual int addMidiMsg(MidiMessage msg); // バッファからMIDIメッセージを取り出すvirtual MidiMessage getMidiMsg(); // バッファ中にあるMIDIメッセージの数を返すvirtual VstInt32 getMidiMessageNum(); // バッファから最初に取り出せるMIDIメッセージのDeltaFramesを返すvirtual VstInt32 getNextDeltaFrames(); // MIDIメッセージが何かを判断し、そのメッセージに対応した// onMidiKeyOn()関数、onMidiControlChange()関数等を呼び出す。virtual void midiProc(MidiMessage mididata); // midiProc()関数から呼び出される。// それぞれのMIDIメッセージに応じて処理を行う// 以下6つはオーバーライドして使うとよいvirtual void onMidiKeyOn (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空virtual void onMidiKeyOff (unsigned char channel, unsigned char noteNo, unsigned char velo) {}; // 関数の中身は空virtual void onMidiProgramChange(unsigned char channel, unsigned char program) {}; // 関数の中身は空virtual void onMidiPoliKeyPress (unsigned char channel, unsigned char noteNo, unsigned char pressure) {}; // 関数の中身は空virtual void onMidiChannelPress (unsigned char channel, unsigned char pressure) {}; // 関数の中身は空virtual void onMidiPitchBend (unsigned char channel, short pb) {}; // 関数の中身は空// 以下2つはあまりオーバーライドして使う必要はないvirtual void onMidiSystemMessage(unsigned char systemmsg, unsigned char data1, unsigned char data2); // 中身はCMidiMsg.cppに記載virtual void onMidiControlChange(unsigned char channel, unsigned char cc, unsigned char value); // 中身はCMidiMsg.cppに記載 // onMidiSystemMessage()関数より呼び出される。// システムメッセージに応じて処理する関数// オーバーライドして使うとよい// (ただし、ホストアプリケーションからSystem Messageが送られることはあまり無い?)virtual void onMidiQuarterFrame(unsigned char data) {};virtual void onMidiSongPointer(short songpoint) {};virtual void onMidiSongSelect(unsigned char data) {};virtual void onMidiChainRequest() {};virtual void onMidiTimingClock() {};virtual void onMidiStart() {};virtual void onMidiContinue() {};virtual void onMidiStop(){};virtual void onMidiActiveSensing() {};virtual void onMidiSystemReset() {}; // onMidiControlChange()関数より呼び出される。// コントロールチェンジメッセージに応じて処理する関数// オーバーライドして使うとよいvirtual void onMidiCC000 (unsigned char channel, unsigned char value) {};virtual void onMidiCC001 (unsigned char channel, unsigned char value) {}; // ModulationDepthvirtual void onMidiCC002 (unsigned char channel, unsigned char value) {};virtual void onMidiCC003 (unsigned char channel, unsigned char value) {};virtual void onMidiCC004 (unsigned char channel, unsigned char value) {};virtual void onMidiCC005 (unsigned char channel, unsigned char value) {}; // PortamentTimevirtual void onMidiCC006 (unsigned char channel, unsigned char value) {};virtual void onMidiCC007 (unsigned char channel, unsigned char value) {}; // ChannelVolumevirtual void onMidiCC008 (unsigned char channel, unsigned char value) {};virtual void onMidiCC009 (unsigned char channel, unsigned char value) {};virtual void onMidiCC010 (unsigned char channel, unsigned char value) {}; // Panvirtual void onMidiCC011 (unsigned char channel, unsigned char value) {};virtual void onMidiCC012 (unsigned char channel, unsigned char value) {}; // Expressionvirtual void onMidiCC013 (unsigned char channel, unsigned char value) {};virtual void onMidiCC014 (unsigned char channel, unsigned char value) {};virtual void onMidiCC015 (unsigned char channel, unsigned char value) {};virtual void onMidiCC016 (unsigned char channel, unsigned char value) {};virtual void onMidiCC017 (unsigned char channel, unsigned char value) {};virtual void onMidiCC018 (unsigned char channel, unsigned char value) {};virtual void onMidiCC019 (unsigned char channel, unsigned char value) {};virtual void onMidiCC020 (unsigned char channel, unsigned char value) {};virtual void onMidiCC021 (unsigned char channel, unsigned char value) {};virtual void onMidiCC022 (unsigned char channel, unsigned char value) {};virtual void onMidiCC023 (unsigned char channel, unsigned char value) {};virtual void onMidiCC024 (unsigned char channel, unsigned char value) {};virtual void onMidiCC025 (unsigned char channel, unsigned char value) {};virtual void onMidiCC026 (unsigned char channel, unsigned char value) {};virtual void onMidiCC027 (unsigned char channel, unsigned char value) {};virtual void onMidiCC028 (unsigned char channel, unsigned char value) {};virtual void onMidiCC029 (unsigned char channel, unsigned char value) {};virtual void onMidiCC030 (unsigned char channel, unsigned char value) {};virtual void onMidiCC031 (unsigned char channel, unsigned char value) {};virtual void onMidiCC032 (unsigned char channel, unsigned char value) {};virtual void onMidiCC033 (unsigned char channel, unsigned char value) {};virtual void onMidiCC034 (unsigned char channel, unsigned char value) {};virtual void onMidiCC035 (unsigned char channel, unsigned char value) {};virtual void onMidiCC036 (unsigned char channel, unsigned char value) {};virtual void onMidiCC037 (unsigned char channel, unsigned char value) {};virtual void onMidiCC038 (unsigned char channel, unsigned char value) {};virtual void onMidiCC039 (unsigned char channel, unsigned char value) {};virtual void onMidiCC040 (unsigned char channel, unsigned char value) {};virtual void onMidiCC041 (unsigned char channel, unsigned char value) {};virtual void onMidiCC042 (unsigned char channel, unsigned char value) {};virtual void onMidiCC043 (unsigned char channel, unsigned char value) {};virtual void onMidiCC044 (unsigned char channel, unsigned char value) {};virtual void onMidiCC045 (unsigned char channel, unsigned char value) {};virtual void onMidiCC046 (unsigned char channel, unsigned char value) {};virtual void onMidiCC047 (unsigned char channel, unsigned char value) {};virtual void onMidiCC048 (unsigned char channel, unsigned char value) {};virtual void onMidiCC049 (unsigned char channel, unsigned char value) {};virtual void onMidiCC050 (unsigned char channel, unsigned char value) {};virtual void onMidiCC051 (unsigned char channel, unsigned char value) {};virtual void onMidiCC052 (unsigned char channel, unsigned char value) {};virtual void onMidiCC053 (unsigned char channel, unsigned char value) {};virtual void onMidiCC054 (unsigned char channel, unsigned char value) {};virtual void onMidiCC055 (unsigned char channel, unsigned char value) {};virtual void onMidiCC056 (unsigned char channel, unsigned char value) {};virtual void onMidiCC057 (unsigned char channel, unsigned char value) {};virtual void onMidiCC058 (unsigned char channel, unsigned char value) {};virtual void onMidiCC059 (unsigned char channel, unsigned char value) {};virtual void onMidiCC060 (unsigned char channel, unsigned char value) {};virtual void onMidiCC061 (unsigned char channel, unsigned char value) {};virtual void onMidiCC062 (unsigned char channel, unsigned char value) {};virtual void onMidiCC063 (unsigned char channel, unsigned char value) {};virtual void onMidiCC064 (unsigned char channel, unsigned char value) {}; // DumperPedalvirtual void onMidiCC065 (unsigned char channel, unsigned char value) {}; // PortamentOnOffvirtual void onMidiCC066 (unsigned char channel, unsigned char value) {}; // SostenutoPedalvirtual void onMidiCC067 (unsigned char channel, unsigned char value) {}; // SoftPedalvirtual void onMidiCC068 (unsigned char channel, unsigned char value) {};virtual void onMidiCC069 (unsigned char channel, unsigned char value) {};virtual void onMidiCC070 (unsigned char channel, unsigned char value) {};virtual void onMidiCC071 (unsigned char channel, unsigned char value) {}; // Resonancevirtual void onMidiCC072 (unsigned char channel, unsigned char value) {}; // ReleaseTimevirtual void onMidiCC073 (unsigned char channel, unsigned char value) {}; // AttackTimevirtual void onMidiCC074 (unsigned char channel, unsigned char value) {}; // Brightnessvirtual void onMidiCC075 (unsigned char channel, unsigned char value) {}; // DecayTimevirtual void onMidiCC076 (unsigned char channel, unsigned char value) {}; // VibratoRatevirtual void onMidiCC077 (unsigned char channel, unsigned char value) {}; // VibratoDepthvirtual void onMidiCC078 (unsigned char channel, unsigned char value) {}; // VibratoDelayvirtual void onMidiCC079 (unsigned char channel, unsigned char value) {};virtual void onMidiCC080 (unsigned char channel, unsigned char value) {};virtual void onMidiCC081 (unsigned char channel, unsigned char value) {};virtual void onMidiCC082 (unsigned char channel, unsigned char value) {};virtual void onMidiCC083 (unsigned char channel, unsigned char value) {};virtual void onMidiCC084 (unsigned char channel, unsigned char value) {};virtual void onMidiCC085 (unsigned char channel, unsigned char value) {};virtual void onMidiCC086 (unsigned char channel, unsigned char value) {};virtual void onMidiCC087 (unsigned char channel, unsigned char value) {};virtual void onMidiCC088 (unsigned char channel, unsigned char value) {};virtual void onMidiCC089 (unsigned char channel, unsigned char value) {};virtual void onMidiCC090 (unsigned char channel, unsigned char value) {};virtual void onMidiCC091 (unsigned char channel, unsigned char value) {}; // ReverbSendvirtual void onMidiCC092 (unsigned char channel, unsigned char value) {}; // ChorusSendvirtual void onMidiCC093 (unsigned char channel, unsigned char value) {};virtual void onMidiCC094 (unsigned char channel, unsigned char value) {};virtual void onMidiCC095 (unsigned char channel, unsigned char value) {};virtual void onMidiCC096 (unsigned char channel, unsigned char value) {};virtual void onMidiCC097 (unsigned char channel, unsigned char value) {};virtual void onMidiCC098 (unsigned char channel, unsigned char value) {};virtual void onMidiCC099 (unsigned char channel, unsigned char value) {};virtual void onMidiCC100 (unsigned char channel, unsigned char value) {};virtual void onMidiCC101 (unsigned char channel, unsigned char value) {};virtual void onMidiCC102 (unsigned char channel, unsigned char value) {};virtual void onMidiCC103 (unsigned char channel, unsigned char value) {};virtual void onMidiCC104 (unsigned char channel, unsigned char value) {};virtual void onMidiCC105 (unsigned char channel, unsigned char value) {};virtual void onMidiCC106 (unsigned char channel, unsigned char value) {};virtual void onMidiCC107 (unsigned char channel, unsigned char value) {};virtual void onMidiCC108 (unsigned char channel, unsigned char value) {};virtual void onMidiCC109 (unsigned char channel, unsigned char value) {};virtual void onMidiCC110 (unsigned char channel, unsigned char value) {};virtual void onMidiCC111 (unsigned char channel, unsigned char value) {};virtual void onMidiCC112 (unsigned char channel, unsigned char value) {};virtual void onMidiCC113 (unsigned char channel, unsigned char value) {};virtual void onMidiCC114 (unsigned char channel, unsigned char value) {};virtual void onMidiCC115 (unsigned char channel, unsigned char value) {};virtual void onMidiCC116 (unsigned char channel, unsigned char value) {};virtual void onMidiCC117 (unsigned char channel, unsigned char value) {};virtual void onMidiCC118 (unsigned char channel, unsigned char value) {};virtual void onMidiCC119 (unsigned char channel, unsigned char value) {};virtual void onMidiCC120 (unsigned char channel, unsigned char value) {}; // AllSoundOffvirtual void onMidiCC121 (unsigned char channel, unsigned char value) {}; // AllControlResetvirtual void onMidiCC122 (unsigned char channel, unsigned char value) {};virtual void onMidiCC123 (unsigned char channel, unsigned char value) {};virtual void onMidiCC124 (unsigned char channel, unsigned char value) {};virtual void onMidiCC125 (unsigned char channel, unsigned char value) {};virtual void onMidiCC126 (unsigned char channel, unsigned char value) {}; // MonoModeOnOffvirtual void onMidiCC127 (unsigned char channel, unsigned char value) {}; // PoliModeOnOff}; 【CMidiMsg.cpp】 #include "CMidiMsg.h" CMidiMsg CMidiMsg(void){clearMidiMsg();} CMidiMsg ~CMidiMsg(void){} void CMidiMsg clearMidiMsg(){// メンバー変数を初期化するcur=0;num=0;memset(buf, 0, sizeof(MidiMessage)*MIDIMSG_MAXNUM);} int CMidiMsg addMidiMsg(VstMidiEvent *midievent){MidiMessage tmp;tmp.deltaFrames = midievent- deltaFrames;tmp.message = midievent- midiData[0] 0xF0;tmp.channel = midievent- midiData[0] 0x0F;tmp.data1 = midievent- midiData[1];tmp.data2 = midievent- midiData[2]; return addMidiMsg(tmp);} int CMidiMsg addMidiMsg(MidiMessage msg){// バッファがいっぱいなら0を返すif (num = MIDIMSG_MAXNUM)return 0; buf[num] = msg; num++;if (num MIDIMSG_MAXNUM) {num = MIDIMSG_MAXNUM;} return 1;}; MidiMessage CMidiMsg getMidiMsg(){MidiMessage tmp = buf[cur]; num--;if( num 0) { num = 0; } cur++;if( cur = MIDIMSG_MAXNUM) { cur = MIDIMSG_MAXNUM -1;} return tmp;} VstInt32 CMidiMsg getMidiMessageNum(){return num;} VstInt32 CMidiMsg getNextDeltaFrames(){return buf[cur].deltaFrames;} void CMidiMsg midiProc(MidiMessage mididata){short msb = 0;short lsb = 0;short pitchbend = 0; switch (mididata.message 0xF0){case 0x80 // ノートオフメッセージonMidiKeyOff(mididata.channel, mididata.data1, mididata.data2);break; case 0x90 // ノートオンメッセージ// ヴェロシティが0の場合はノートオフメッセージとして扱うif (mididata.data2 0){onMidiKeyOn(mididata.channel, mididata.data1, mididata.data2);}else{onMidiKeyOff(mididata.channel, mididata.data1, mididata.data2);}break; case 0xA0 // キープレッシャーメッセージonMidiPoliKeyPress(mididata.channel, mididata.data1, mididata.data2);break; case 0xB0 // コントロールチェンジメッセージonMidiControlChange(mididata.channel, mididata.data1, mididata.data2);break; case 0xC0 // プログラムチェンジメッセージonMidiProgramChange(mididata.channel, mididata.data1);break; case 0xD0 // チャンネルプレッシャーメッセージonMidiChannelPress(mididata.channel, mididata.data1);break; case 0xE0 // ピッチベンドメッセージlsb = (mididata.data1);msb = (mididata.data2);pitchbend = ((msb 7) | lsb) - 8192;onMidiPitchBend(mididata.channel, pitchbend);break; case 0xF0 // システムメッセージonMidiSystemMessage((mididata.message 0xF0) | (mididata.channel 0x0F), mididata.data1, mididata.data2);break;}} void CMidiMsg onMidiSystemMessage(unsigned char systemmsg, unsigned char data1, unsigned char data2){ short lsb = (data1);short msb = (data2);switch(systemmsg){case 0xF1 onMidiQuarterFrame(data1); break;case 0xF2 onMidiSongPointer( (msb 7) | lsb ); break;case 0xF3 onMidiSongSelect(data1); break;case 0xF6 onMidiChainRequest(); break;case 0xF8 onMidiTimingClock(); break;case 0xFA onMidiStart(); break;case 0xFB onMidiContinue(); break;case 0xFC onMidiStop(); break;case 0xFE onMidiActiveSensing(); break;case 0xFF onMidiSystemReset(); break;default break;}} void CMidiMsg onMidiControlChange(unsigned char channel, unsigned char cc, unsigned char value){switch(cc){case 0 onMidiCC000 (channel, value); break;case 1 onMidiCC001 (channel, value); break;case 2 onMidiCC002 (channel, value); break;case 3 onMidiCC003 (channel, value); break;case 4 onMidiCC004 (channel, value); break;case 5 onMidiCC005 (channel, value); break;case 6 onMidiCC006 (channel, value); break;case 7 onMidiCC007 (channel, value); break;case 8 onMidiCC008 (channel, value); break;case 9 onMidiCC009 (channel, value); break;case 10 onMidiCC010 (channel, value); break;case 11 onMidiCC011 (channel, value); break;case 12 onMidiCC012 (channel, value); break;case 13 onMidiCC013 (channel, value); break;case 14 onMidiCC014 (channel, value); break;case 15 onMidiCC015 (channel, value); break;case 16 onMidiCC016 (channel, value); break;case 17 onMidiCC017 (channel, value); break;case 18 onMidiCC018 (channel, value); break;case 19 onMidiCC019 (channel, value); break;case 20 onMidiCC020 (channel, value); break;case 21 onMidiCC021 (channel, value); break;case 22 onMidiCC022 (channel, value); break;case 23 onMidiCC023 (channel, value); break;case 24 onMidiCC024 (channel, value); break;case 25 onMidiCC025 (channel, value); break;case 26 onMidiCC026 (channel, value); break;case 27 onMidiCC027 (channel, value); break;case 28 onMidiCC028 (channel, value); break;case 29 onMidiCC029 (channel, value); break;case 30 onMidiCC030 (channel, value); break;case 31 onMidiCC031 (channel, value); break;case 32 onMidiCC032 (channel, value); break;case 33 onMidiCC033 (channel, value); break;case 34 onMidiCC034 (channel, value); break;case 35 onMidiCC035 (channel, value); break;case 36 onMidiCC036 (channel, value); break;case 37 onMidiCC037 (channel, value); break;case 38 onMidiCC038 (channel, value); break;case 39 onMidiCC039 (channel, value); break;case 40 onMidiCC040 (channel, value); break;case 41 onMidiCC041 (channel, value); break;case 42 onMidiCC042 (channel, value); break;case 43 onMidiCC043 (channel, value); break;case 44 onMidiCC044 (channel, value); break;case 45 onMidiCC045 (channel, value); break;case 46 onMidiCC046 (channel, value); break;case 47 onMidiCC047 (channel, value); break;case 48 onMidiCC048 (channel, value); break;case 49 onMidiCC049 (channel, value); break;case 50 onMidiCC050 (channel, value); break;case 51 onMidiCC051 (channel, value); break;case 52 onMidiCC052 (channel, value); break;case 53 onMidiCC053 (channel, value); break;case 54 onMidiCC054 (channel, value); break;case 55 onMidiCC055 (channel, value); break;case 56 onMidiCC056 (channel, value); break;case 57 onMidiCC057 (channel, value); break;case 58 onMidiCC058 (channel, value); break;case 59 onMidiCC059 (channel, value); break;case 60 onMidiCC060 (channel, value); break;case 61 onMidiCC061 (channel, value); break;case 62 onMidiCC062 (channel, value); break;case 63 onMidiCC063 (channel, value); break;case 64 onMidiCC064 (channel, value); break;case 65 onMidiCC065 (channel, value); break;case 66 onMidiCC066 (channel, value); break;case 67 onMidiCC067 (channel, value); break;case 68 onMidiCC068 (channel, value); break;case 69 onMidiCC069 (channel, value); break;case 70 onMidiCC070 (channel, value); break;case 71 onMidiCC071 (channel, value); break;case 72 onMidiCC072 (channel, value); break;case 73 onMidiCC073 (channel, value); break;case 74 onMidiCC074 (channel, value); break;case 75 onMidiCC075 (channel, value); break;case 76 onMidiCC076 (channel, value); break;case 77 onMidiCC077 (channel, value); break;case 78 onMidiCC078 (channel, value); break;case 79 onMidiCC079 (channel, value); break;case 80 onMidiCC080 (channel, value); break;case 81 onMidiCC081 (channel, value); break;case 82 onMidiCC082 (channel, value); break;case 83 onMidiCC083 (channel, value); break;case 84 onMidiCC084 (channel, value); break;case 85 onMidiCC085 (channel, value); break;case 86 onMidiCC086 (channel, value); break;case 87 onMidiCC087 (channel, value); break;case 88 onMidiCC088 (channel, value); break;case 89 onMidiCC089 (channel, value); break;case 90 onMidiCC090 (channel, value); break;case 91 onMidiCC091 (channel, value); break;case 92 onMidiCC092 (channel, value); break;case 93 onMidiCC093 (channel, value); break;case 94 onMidiCC094 (channel, value); break;case 95 onMidiCC095 (channel, value); break;case 96 onMidiCC096 (channel, value); break;case 97 onMidiCC097 (channel, value); break;case 98 onMidiCC098 (channel, value); break;case 99 onMidiCC099 (channel, value); break;case 100 onMidiCC100 (channel, value); break;case 101 onMidiCC101 (channel, value); break;case 102 onMidiCC102 (channel, value); break;case 103 onMidiCC103 (channel, value); break;case 104 onMidiCC104 (channel, value); break;case 105 onMidiCC105 (channel, value); break;case 106 onMidiCC106 (channel, value); break;case 107 onMidiCC107 (channel, value); break;case 108 onMidiCC108 (channel, value); break;case 109 onMidiCC109 (channel, value); break;case 110 onMidiCC110 (channel, value); break;case 111 onMidiCC111 (channel, value); break;case 112 onMidiCC112 (channel, value); break;case 113 onMidiCC113 (channel, value); break;case 114 onMidiCC114 (channel, value); break;case 115 onMidiCC115 (channel, value); break;case 116 onMidiCC116 (channel, value); break;case 117 onMidiCC117 (channel, value); break;case 118 onMidiCC118 (channel, value); break;case 119 onMidiCC119 (channel, value); break;case 120 onMidiCC120 (channel, value); break;case 121 onMidiCC121 (channel, value); break;case 122 onMidiCC122 (channel, value); break;case 123 onMidiCC123 (channel, value); break;case 124 onMidiCC124 (channel, value); break;case 125 onMidiCC125 (channel, value); break;case 126 onMidiCC126 (channel, value); break;case 127 onMidiCC127 (channel, value); break;default break;}} 【MyMidiSample2VST.cpp】 // ============================================================================================// インクルードファイル// ============================================================================================#include stdlib.h #include "audioeffectx.h" #include "CMidiMsg.h" // ============================================================================================// 設計情報の記入// ============================================================================================#define MY_VST_INPUT_NUM 2 //入力数。モノラル入力=1、ステレオ入力=2#define MY_VST_OUTPUT_NUM 2 //出力数。モノラル出力=1、ステレオ出力=2 #define MY_VST_UNIQUE_ID SMPL //ユニークID //公開する場合は以下URLで発行されたユニークIDを入力する。 //http //ygrabit.steinberg.de/~ygrabit/public_html/index.html #define MY_VST_PRESET_NUM 1 //プリセットプログラムの数#define MY_VST_PARAMETER_NUM 0 //パラメータの数 // ============================================================================================// VSTの基本となるクラス// ============================================================================================class MyMidiSample2VST public AudioEffectX , public CMidiMsg{protected float volume;public MyMidiSample2VST (audioMasterCallback audioMaster); // 音声信号を処理するメンバー関数virtual void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); // MIDIメッセージをホストアプリケーションから受け取るためのメンバー関数VstInt32 processEvents (VstEvents* events); void onMidiCC007(unsigned char channel, unsigned char value);}; // ============================================================================================// このVSTのを生成するための関数// ============================================================================================AudioEffect* createEffectInstance (audioMasterCallback audioMaster){//newでこのVSTを生成したポインタを返すreturn new MyMidiSample2VST (audioMaster);} MyMidiSample2VST MyMidiSample2VST (audioMasterCallback audioMaster) AudioEffectX (audioMaster, MY_VST_PRESET_NUM, MY_VST_PARAMETER_NUM){//VSTの初期化を行う。 //以下の関数を呼び出して入力数、出力数等の情報を設定する。//必ず呼び出さなければならない。setNumInputs (MY_VST_INPUT_NUM); //入力数の設定setNumOutputs (MY_VST_OUTPUT_NUM); //出力数の設定setUniqueID (MY_VST_UNIQUE_ID); //ユニークIDの設定 isSynth (true); //このVSTがSynthかどうかのフラグを設定。 //Synthの場合…true、Effectorの場合…false canProcessReplacing (); //このVSTが音声処理可能かどうかのフラグを設定。 //音声処理を行わないVSTはないので必ずこの関数を呼び出す。 //上記の関数を呼び出した後に初期化を行うvolume = 1.0f;} void MyMidiSample2VST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 // MIDIメッセージがあるか確認if ( getMidiMessageNum() 0){// MIDIメッセージを処理するタイミングかどうかを確認する。if( getNextDeltaFrames() = i){// MIDIメッセージをバッファから取り出し処理するmidiProc( getMidiMsg() );}} //出力バッファへ書き込む。outL[i] = volume * (float)((rand() % 256) -128) / 255.0f;outR[i] = volume * (float)((rand() % 256) -128) / 255.0f;}} // MIDIメッセージを処理するメンバー関数// processReplacing()の前に必ず1度だけ呼び出される。// VstInt32 MyMidiSample2VST processEvents (VstEvents* events){// MIDIのリストを初期化します。clearMidiMsg(); int loops = (events- numEvents); // VSTイベントの回数だけループをまわす。for (int i = 0;i loops; i++){// 与えられたイベントがMIDIならばmidimsgbufにストックするif ((events- events[i])- type == kVstMidiType){VstMidiEvent *midievent = (VstMidiEvent*)(events- events[i]);if( !addMidiMsg(midievent) ){break;}}} // 1を返さなければならないreturn 1;} // // onMidiCC007()関数をオーバーライドして、MIDI CC7の場合の動作を定義する。// ここではチャンネルに関係なく、MIDI CC7メッセージを受け取るとノイズのボリュームを// 変更するようにしている。void MyMidiSample2VST onMidiCC007 (unsigned char channel, unsigned char value){volume = (float)(value) / 127.0f;} VST Tipsトップページへ(準備中) 同一カテゴリのTips 項目 No. 概要
https://w.atwiki.jp/vstdev/pages/14.html
VSTの開発環境について スタインバーグのVSTSDKはC++で書かれています。 windowsの方はVC++や無料のものならVC++express editionが良いでしょう。 macの方は【CodeWarriorが良いかと思われます。 VC++express editionの入手先 http //www.microsoft.com/japan/msdn/vstudio/Express/
https://w.atwiki.jp/gdiplus2/pages/4.html
1.使い方 2.バイナリ 3.readme 4.SS 5.履歴 本家版(最新のみ)stable version (gdi++20060927) 以下改良版(上に行くほど最新)gdi0261 (常駐GUI) gdi0147 (常駐 gdippManager) gdi0118 (gdi0116のバグ修正+おまけ改) gdi0116 (gdi0093のバグ修正+Pico氏(gdi0112)の縮小アルゴリズムを組み込み) gdi0112 (MMX対応など) gdi0110 (gdi0102 + 735Image) gdi0109 (up105のSSE無し版) gdi0107 (gdi0104-エンハンスフィルタの改良版-のバグ修正) gdi0105 (1bit+アルファブレンド(注 要SSE2、きわめて未完成)) gdi0102 (gdi0097の環境設定拡張版) gdi0097 (トレイ格納タイプのgdi.exe gdi0060+gdi0061) gdi0093 (ソースをシェイプアップ?20060923版相当に戻してみた) gdi0088 (サー(ry ) gdi0079 (20060927+allgdi+ExcludeModule+TLS その2) gdi0076 (gdi0075のズレるバグ修正) gdi0075 (20060927+allgdi+ExcludeModule+TLS) gdi0061 (gdi0029+GUI) gdi0060 (トレイ格納タイプのgdi.exe) gdi0052 (gdi0049 修正版) gdi0049 (gdi0025+194+ソース分割) gdi++20060929-enhance ( 104-106の修正) gdi0038 (エンハンサの修正 SSE2 Normal) gdi++20060928-enhance (バグ修正) gdi0031 (gdi++ GUI) gdi0029 (トレイ格納タイプのgdi.exe) gdi0027 (944 をベースにソースを整理してみた。) gdi0025 (gdi0021+953+951+最適化) gdi0023 (キャッシュ周りをマルチスレッド化) gdi0021 (最適化ビルド+いろいろ) gdi0019 (20060927版+バージョンリソース付きdll+ 730のallgdi++) gdi0018 (0017+version+allgdi) gdi0017 (gdi0004lzh+individualセクション有効化) gdi0016 (ICC9.1にてPGO付きビルドSSE2/Pentium4向け) gdi0012 (フォントごとにウェイト指定) gdi0011 (デバッグビルド) gdi0009 (PentiumM(Banias or later)) gdi0004 (sse2/pentium4用に最適化したもの) gdi++20060927-enhance (フィルタ修正版) アイコンicon 本家版(最新のみ) stable version (gdi++20060927) 本家のダウンロードページにて。 784 名前: ◆0x0D/0x20I 2006/09/27(水) 12 00 00 ID kdcoJI+4 GetTextExtentPoint32()が除外フォントでも処理していたのを修正 IsValidDC()関数を新たに作って、画面用のDCかどうかをチェックするようになった 印刷時に崩れる問題が解決しているかもしれない) 501氏によるソースの整理 狩野氏によるエッジ強調フィルタの搭載(Enhanceオプションが追加されています) gdi++.dllがGetMsgProc()をエクスポートする仕様に( 654氏= 168氏) デフォルトでFixedSysとMarlettを除外するようにしておく ここらへんで、とりあえずまとめておきました。サイトにうpしてるのは、ある程度stableなnightly build(今日はお昼だけど)って感じです。 大勢の人が関わってもらえるようになってきて、現状の流れで漏れのサイトにうpし続けるっていうのもちょっとアレだと思うし、そろそろライセンスとか権利の問題を明確にしておかなきゃいけないんだろうと思う。 779 779 名前:名無し~3.EXE 2006/09/27(水) 11 24 52 ID o91aaQSC gVimで表示がおかしくなります。 http //www.uploda.org/uporg529423.png 右は0924版で表示が崩れ、左は0926版(0925版も一緒)でAA効いてません。 フォントはMSゴシック10ポイント、設定はデフォルトのini、SSはVista RC1ですがXP SP2でも状況は同じでした。 他のアプリでは問題ないんですが・・・ うーん、スムージングが効いてないですかぁ。0924でズレってるってことはExtTextOutA周りの問題ってことだけど、うーん、XP以降のバージョンではオリジナルのExtTextOutAがExtTextOutWを呼ぶ計算になってるんだけど・・・ちょっとチェックしてみます。 780 780 名前:名無し~3.EXE 2006/09/27(水) 11 25 00 ID hvd1nGGx Sn でつくってみた。なにか設定が必要なら言ってください。 アクセス制限に引っかかることはないと思いたい。 ttp //free.flop.jp/gdi++/ うわ、ロダができてる。乙。 800 名前:名無し~3.EXE 2006/09/27(水) 14 39 27 ID a1jtWTIq 784 Firefoxで選択範囲がずれてる件( 758)は治りました。乙! ただ、textareaに入力してるとだんだんおかしくなる http //free.flop.jp/gdi++/src/gdi0003.png 888 名前:名無し~3.EXE 2006/09/27(水) 20 16 57 ID amHmqYMt 784 のバージョンだとEnhance=1以上にすると シャープネスノイズが出るようになってます。 20pt程度のフォントサイズで適用するとよくわかるかも。 個人的には1を基準とするなら0.2くらいの効果が好みです。 あと、Quality=4にすると対応していないマシンのせいか 適用したアプリが全て強制終了するように。。。 AllGdiで実行したのでOSを巻き込んで死亡(;´д⊂ スペッコ:WinXP SP2、AthlonXP、1024M 以下改良版(上に行くほど最新) 容量規制の為FreeType版は【gdi++.dll FreeType】のページへ移しました。 gdi0261 (常駐GUI) http //free.flop.jp/gdi++/src/gdi0261.zip gdippManager ver.1105 ver.1029 ベース 機能の変更点 ・GUIつけてみた ・DLL側の関数で代用できるケースはまずそちらを使うようにした ・細かい修正とか ・VS2005EEのプロジェクトつけた *.sln / *.vcproj ※GUI注意 ・セクションがない、キーがない、値がない(一部除く)項目は編集できず出力もしません 無条件に出力するとDLLが対応してないINI項目がふえちゃうから ・数値を自由に指定できる項目は-1~99で指定できます 「基本的には」DLL側で最小値/最大値に丸めてるので 実際にどの項目がどの値まで有効値とするのかあまり見てないです ・Individualセクションにダミーでもデータ入れておかないと、 新旧どっちの書式かわからないので警告出てうざいです ※FreeType版 ・そのうちに explorer.exe がハングするので事実上利用不能 右クリックメニューとかでハングする gdi0147 (常駐 gdippManager) http //free.flop.jp/gdi++/src/gdi0147.zip 692 名前:名無し~3.EXE 2006/10/28(土) 02 21 10 ID SN2pkdqO 常駐 システムディレクトリとexeサブディレクトリ内にある複数のDLLを管理できるようにした でもGUIは実装してない ※Studentがイチから書き直しているので利用は警戒しる gdi0118 (gdi0116のバグ修正+おまけ改) http //free.flop.jp/gdi++/src/gdi0118.zip 883 名前:168 2006/10/06(金) 10 09 12 ID iQtt8ZFA 868(gdi0116)で落ちるバグ取れたかも。__assume入れてたの忘れてた ついでにおまけに少し手を加えますた。 多重起動とかバージョン情報のハイパーリンクとかww gdi0116 (gdi0093のバグ修正+Pico氏(gdi0112)の縮小アルゴリズムを組み込み) http //free.flop.jp/gdi++/src/gdi0116.zip 868 名前:名無し~3.EXE 2006/10/06(金) 01 47 44 ID iQtt8ZFA 漸くデバッグ完了したのでとりあえず暫定版ビルドしてみますた 多分 644, 655, 659, 712あたりの修正とPico氏の 834ぐらい ってか日が経ちすぎて忘れたorz 644 名前:名無し~3.EXE 2006/10/01(日) 19 19 42 ID 2rzB94Gp とりあえずDrawStateもフックして強引に灰色テキストを描画できるようにしてみたけど、なんかイマイチ http //free.flop.jp/gdi++/src/gdi0098.png 639 漏れの環境だとそのアドレスには既にINDICDLL.DLLとかいうのが読み込まれててバッティングするけど 655 名前:名無し~3.EXE 2006/10/01(日) 22 05 23 ID 2rzB94Gp うpろだ100記念w 644のやつはアイコンとかが灰色で描画されてなかったので他の方法を模索してみた。 とりあえずDST_TEXTとDST_PREFIXTEXTは何とかなったけど、DST_COMPLEXはもうこれ以上無理のような気がしてきた http //free.flop.jp/gdi++/src/gdi0100.png 654 んーotfか・・・とりあえずDrawStateの問題が片付いたら調べてみます。 片付きそうにないけどorz 659 名前:名無し~3.EXE 2006/10/01(日) 23 01 51 ID 2rzB94Gp DrawStateとは関係ないけどこれ直してみますた。 http //free.flop.jp/gdi++/src/gdi0101.png これで1行下にズレてる系のバグは全部直ってるはず。 712 名前:名無し~3.EXE 2006/10/02(月) 22 44 45 ID dtRB8HD5 スタート→プログラムにあるIEのショートカットをgdi++.exeで開けない気がする あと理由は知らんけどダイアログがズレるバグとwin2kでメモリがreadに・・・のバグはなぜか出てない模様(環境によっては出てるかも) おまけフォルダにサービス化セットあり gdi0112 (MMX対応など) http //free.flop.jp/gdi++/src/gdi0112.zip 834 名前:Pico ◆PicoKHZGNI 2006/10/05(木) 07 47 55 ID 3uBaMu8k 意外とMMX版に需要が有るようなので作成してみました。 Qualityをちゃんと読むようになりました。 Quality=7 の時のみSSE2やMMXを使用します。 それ以外(0~6,11,15)の場合は、Cのコードで動きます。割と遅いですorz MMXに対応しました。いやぁ命令の名前が共通ってのは便利だな。 デフォルトではSSE2以上向けのgdi++.dllが入っているので、 MMX対応CPUならmmxフォルダ、そうでないならgenericフォルダの物と置き換えてください。 ズレとかはまだ全然直っていないはず。 gdi0110 (gdi0102 + 735Image) http //free.flop.jp/gdi++/src/gdi0110.zip 832 名前:名無し~3.EXE 2006/10/05(木) 02 36 25 ID qwK8X3LA 常駐Manager とりあえずプレビュー機能と適用ボタンまでINI処理を結構書き換えてしまったのでINIに保存されてねーぞゴルァ! みたいなのがあったらごめん 735に触発されて作ってたんだけど今の今まで要旨が "プレビュー" のほうだと思ってたせいで "Managerだけに適用" をすっ飛ばしてました('A`) 735 名前:名無し~3.EXE 2006/10/03(火) 16 36 33 ID U1YlA+Z8 gdippMangager.exeに適用ボタン、またはgdippManager.exeだけに変更を加えてプレビューできる機能とか出来ないかな? こんな感じに http //free.flop.jp/gdi++/src/gdi0103.png まだ全体をころころ変えてるとエラー出る場合があるのであったらいいなというだけです gdi0109 (up105のSSE無し版) http //free.flop.jp/gdi++/src/gdi0109.zip 825 名前:369 2006/10/05(木) 00 32 32 ID KJEE4Gl9 778 SSE使わないようにしてみたが動くか? 縮小が3倍、全体で見ると1割ぐらい遅くなってるけど。 gdi0107 (gdi0104-エンハンスフィルタの改良版-のバグ修正) http //free.flop.jp/gdi++/src/gdi0107.zip(gdi0104のバグ修正版) http //free.flop.jp/gdi++/src/gdi0104.zip(エンハンスフィルタの改良版) 766 名前:67 2006/10/04(水) 02 49 30 ID vnJAecEO エッジ強調フィルタの改良版をアップローダに上げました。今回は、文字のいちばん外側のピクセルにはフィルタを掛けず、内側にはきっちり今まで通りの処理を施すようにしてあります。 ベースバージョンは公式の20060927です。 754 754 名前:名無し~3.EXE 2006/10/03(火) 22 26 21 ID ylMzz5mE すまん、アイデアだけ。 ①現状の単純平均から重みつき平均を使う。 111 141 111 これでもやっと感を減らしつつ、出すところは出す。どんなフィルタがいいんだろ? ②現在の平均を取る部分の変わりに、ルックアップテーブルを作る。 LUT[0-256*16] データサイズはせいぜい もしガンマ補正が必要ならば、LUT上にかける。 これで除算が無くなるから、そこそこ二次キャッシュがあればスピードも上がる? 縮小時に重みつき平均を取ると、同じ太さの線が(縮小後の)ピクセルのまん中にある時と橋にある時で濃さが変わってしまうのが難点です。2つのピクセルの境界に沿って線が引かれているような時は、片方のピクセルにかかっている分を無視して、隣のピクセルに足し込んでやると文字全体の濃さが変わらずにコントラストが改善できるんですが、とても重い処理になりそうです。 755 755 名前:名無し~3.EXE 2006/10/03(火) 22 43 03 ID EozvE0/P ラプラシアンフィルタを使ったシャープネスフィルタがいいかも laplacian 0 1 0 1 -4 1 0 1 0 double rate = /* 0.0 - 1.0 */; double result = cm- i() - rate*(ct- i() + lm- i() + rm- i() + cb- i() - 4*cm- i()); 今までのフィルタがまさにラプラシアンをめんどくさいやり方で実装したものです。-1 2 -1 のフィルタを縦横にかけて中間結果を別々に持ち、最後に総和を取っています。 758 758 名前:名無し~3.EXE 2006/10/03(火) 23 53 17 ID PbXGshjl 754 ルックアップテーブルは考えた。 描画エリアの背景を拡大してフォントレンダラに送り込んで描画後に縮小だ。 白地に黒とかなら問題ないんだが、ガンマ補正入りルックアップテーブルなぞ使ったら背景の影響を受けるし、文字の背景画像にも影響を与えるんだなコレが。 常に白黒で書いて好きにガンマ補正をかけてから、背景との合成は自前で計算したほうがいいかも。8倍に拡大描画すれば、1の立ったビットの個数を表引きで求められるので、それなりに速く実装できそう gdi0105 (1bit+アルファブレンド(注 要SSE2、きわめて未完成)) http //free.flop.jp/gdi++/src/gdi0105.zip 770 名前:Pico ◆PicoKHZGNI 2006/10/04(水) 07 11 53 ID hsbLqC/N 0079版をベースにして、1bitで8x8倍で描画して、アルファブレンドさせてみました。 SSE2を使った縮小アルゴリズムを書いてみたら、かなり軽くなった気がするので、まだアルファ版以下の完成度ですが、良かったら試してみてください。 注意 △とても未完成です。 △Quality、Enhanceの値は無視しています。 △8*8なので64階調です。 △SSE2専用です。 △かなり大量にコードが変更されています。新しいバグが入っているかも。 gdi0102 (gdi0097の環境設定拡張版) http //free.flop.jp/gdi++/src/gdi0102.zip 708 名前:名無し~3.EXE 2006/10/02(月) 22 00 24 ID WNYntwRQ guiで環境設定のExcludeModuleとIndividualにも対応してみました。 機能の変更点 ・環境設定のExcludeModuleとIndividualにも対応 ・Weightの最大値をとりあえず32に変更 ソースの注釈 ・個人的にリソースいじるのにVC6を使うので、それ用のプロジェクトファイルも追加。 ・INIパラメータ用の変数を動的に取得して、設定後解放するようにした。 ・他いくつか細かい修正。 gdi0097 (トレイ格納タイプのgdi.exe gdi0060+gdi0061) http //free.flop.jp/gdi++/src/gdi0097.zip 630 名前:名無し~3.EXE 2006/10/01(日) 16 49 31 ID h1TSe0i6 常駐gdi 60(gdi0060)ベース+61(gdi0061)のGUI 基本的にはくっつけただけだけど変更点は/***/で検索してたどってね あとVSEEならプリコンパイル済みヘッダ機能使えるファイル構成にした gdi0093 (ソースをシェイプアップ?20060923版相当に戻してみた) http //free.flop.jp/gdi++/src/gdi0093.zip 508 名前:名無し~3.EXE 2006/10/01(日) 02 47 10 ID 2rzB94Gp 501 501 名前:名無し~3.EXE 2006/10/01(日) 01 37 31 ID 9nVDSxVX 0922改造版レベルまでソースをシェイプアップしたまへ ソースをシェイプアップ、の意味が判らんが とりあえず20060923版相当に戻してみた ここ最近の追加機能が全く使えんけどソースは見やすくなったと思うw 20060923版と比べて 20060927版までのバグ修正 Jane Doeなどでズレるバグ修正 UseSubPixel=1のときは常にサブピクセルレンダリング ビットマップフォントは常にExclude キャッシュ、TLS 使えるもの Quality Weight UseSubpixel SubpixelDirection Exclude 使えないもの Enhance MaxHeight ForceAntialiasedQuality ExcludeModule SSE2、SSE3用縮小ソース allgdi++、gdiなど常駐機能全て gdi0088 (サー(ry ) http //free.flop.jp/gdi++/src/gdi0088.zip 412 名前:名無し~3.EXE 2006/09/30(土) 17 39 32 ID 4i2JaSpG http //free.flop.jp/gdi++/src/gdi0081.png むしゃくしゃしたのでやった。今も反省していない。 確認環境:win2k on VMware Playerのみ gdisetup.exeを実行すると登録できる 削除する時もgdisetup.exeを使用する これとallgdi++.exe、gdi.exe等を併用したときの動作は無保証 付属のgdi++.dll以外での動作も無保証 何が起こっても一切無保証 gdi0079 (20060927+allgdi+ExcludeModule+TLS その2) http //free.flop.jp/gdi++/src/gdi0079.zip 中身は多分20060927+allgdi+ExcludeModule+TLSぐらい ズレるバグ修正(OpenJaneDoe、part2 82で確認、それ以外は不明) ビットマップフォントはExcludeの設定に関わらず強制的にExcludeする gdi++、allgdi++相当の機能をdllに内包 gdi++.exe経由で起動したらExcludeModuleは読み飛ばすようにした IMPL_ExtTextOutWをいろいろ整理 UseSubPixel=1のときQualityの設定を無視(Quality=2とみなす) TLS周りでメモリリークしてたのを修正 StringHashのignoreCaseの動作が逆だったのを修正 gdi++ gdi++.exe又はgdi++.vbsを使うと従来通りの動作 以下のコマンドも利用できる rundll32.exe "gdi++.dll",GDIPlusPlus_RunDLL file argument ... allgdi allgdi++.vbsを実行すると起動中の全プロセスにgdi++.dllが読み込まれる allgdi+p.vbsで常駐モード(もう一度実行すると常駐解除) それぞれ以下のコマンドを実行しても同じ事が得られる rundll32.exe "gdi++.dll",AllGDIPlusPlus_RunDLL rundll32.exe "gdi++.dll",AllGDIPlusPlus_RunDLL -p ExcludeModule allgdi++使用時のみ有効。特定のプロセスにgdi++.dllを読み込ませなくする Exclude"Process"ではないので↓とかも可能 [ExcludeModule] hogehoge.dll gdi0076 (gdi0075のズレるバグ修正) http //free.flop.jp/gdi++/src/gdi0076.zip 384 名前:名無し~3.EXE 2006/09/30(土) 12 26 57 ID 4i2JaSpG 350(gdi0075)でズレるバグ修正 UseSubPixel=1のときQualityを無視 チラシの裏 ズレるバグって浮動小数点の丸め誤差かよorz /チラシの裏 gdi0075 (20060927+allgdi+ExcludeModule+TLS) http //free.flop.jp/gdi++/src/gdi0075.zip 350 名前:名無し~3.EXE 2006/09/30(土) 01 01 43 ID 4i2JaSpG 今日のGDI++w 中身は多分20060927+allgdi+ExcludeModule+TLSぐらい ズレるバグ修正(OpenJaneDoe、GreenPad、 82で確認、それ以外は不明) 82 名前:名無し~3.EXE 2006/09/28(木) 08 56 41 ID 75MYieLo OpenJaneDoeのソースを元にして描画がズレるのを再現してみました。 時間のある人はこれ使ってgdi++.dllをデバッグしてください。 http //free.flop.jp/gdi++/src/gdi0032.zip ビットマップフォントはExcludeの設定に関わらず強制的にExcludeする gdi++、allgdi++相当の機能をdllに内包 gdi++.exe経由で起動したらExcludeModuleは読み飛ばすようにした IMPL_ExtTextOutWをいろいろ整理 ソースは付けていません(弄りすぎたし派生バージョン多すぎてpatch作っても意味無さそう) が、漏れにソースくれればpatchをマージして送り返しますw gdi0061 (gdi0029+GUI) http //free.flop.jp/gdi++/src/gdi0061.zip 296 名前:名無し~3.EXE 2006/09/29(金) 18 26 49 ID Thxs4ylL Win32SDK でGUI作ってみた。 ベースはgdi0029 こういうのへの参加が初体験でドキドキ・・・ gdi0029.zip をベースにINIファイル用GUIを追加。 名前もgdipp.exeに変更しました。 メニューの「INIファイルを開く」を「環境設定...」に変更 ダイアログが開いて、各設定値を変更できます。 対応しているのは基本的にstable版のもの。 *[Exclude]セクションは一度クリアしてから追加しているため、途中にコメント行があっても消えてしまいます。 OKボタンでダイアログを閉じると、新しい設定値でINIファイルを更新します。 更新内容を反映するために gdi++のフックをやり直しています。 *このやり直し方がこれで問題無いかは、今いち自信無かったり・・・ gdi0060 (トレイ格納タイプのgdi.exe) http //free.flop.jp/gdi++/src/gdi0060.zip 267 名前:名無し~3.EXE 2006/09/29(金) 15 47 40 ID uT1dBezs 264 お疲れさんです gdi.exe(ちなみに常駐ソース起こしたのは前スレ742:◆0x0D/0x20I氏 とりあえずDLLのバージョンが表示できたり DLL読んでないときに操作できるようにしてみた gdi0052 (gdi0049 修正版) http //free.flop.jp/gdi++/src/gdi0052.zip 215 名前:555 2006/09/29(金) 03 46 30 ID l/FxUuFO 207, 209 207 名前:名無し~3.EXE 2006/09/29(金) 02 00 58 ID S45t8QPf ExcludeModule効かないです。ウィルスソフトの数個のプロセスがunlockerでもロック解除出来なくて、再起動するまでロックしたままなので死活問題なんです。 209 名前:名無し~3.EXE 2006/09/29(金) 02 15 53 ID ad2vtG2/ 206のはgdi0025ベース(ExcludeModule効かない)だからかな。 Enhanceはいい感じになりますた。メニュー部分がおかしくなるけど…。 207 普通にD Dとかで、指定アプリのみ++適用で我慢するしか。 一度allgdiやっちゃったら病み付きになるのは仕方ないけどw ExcludeModule修正しました。 Excludeも148のを取り込んでみた。 148 名前:名無し~3.EXE 2006/09/28(木) 18 06 00 ID +FMMBxuw ほかにもビットマップって結構あるんだね [Exclude] メイリオ Meiryo Marlett System FixedSys Modern MS Sans Serif MS Serif Roman Small Fonts Script Courier 218 名前:名無し~3.EXE 2006/09/29(金) 10 56 30 ID 2RRtMqFQ 215 Quality=1 のとき Enhance= を1以上にすると落ちる。 あと、void Cache ProcessTerm() で voidなのにreturnがあると怒られる。 gdi0049 (gdi0025+194+ソース分割) http //free.flop.jp/gdi++/src/gdi0049.zip 206 名前:555:2006/09/29(金) 01 51 55 ID l/FxUuFO gdi0025.lzh をベースに 194(gdi++20060929-enhance) を取り入れてソースを分割したもの 一応、SSE, SSE2 版付き。PGO 下のは無いです。 後の修正は builderscomment.txt 参照のこと 余計なお節介だったらごめん。これにてたぶん名無しに戻ります。 gdi++20060929-enhance ( 104-106の修正) http //khdd.net/kanou/kangae/2006/gdi++20060929-enhance.zip 194 名前:67 2006/09/29(金) 00 45 24 ID b1ozCFz3 104-106 104 名前:名無し~3.EXE 2006/09/28(木) 12 49 39 ID czObJZg9 http //free.flop.jp/gdi++/src/gdi0035.png 別なバグが発生したようです 105 名前:名無し~3.EXE 2006/09/28(木) 12 49 48 ID 4Y3odhPr 103 選択文字列がおかしくなってます。 106 名前:名無し~3.EXE 2006/09/28(木) 12 50 54 ID Ojx0uxHz 104 ファミコンゲームの画面かと思った。 修正しました。 背景が透明な場合をちゃんと区別するようにしたので、これで直ったはずです。Enhance 有効のときだけ出るバグはもうないという希望的観測を持っております。 あとは画質の改善 (今は o が八角形ぽく見える) や高速化を考えていきたいと思っております。では。 199 名前:名無し~3.EXE 2006/09/29(金) 01 04 15 ID F1gcbA5c 194 Live2ch でぐりぐりスクロースしてもレインボーカラーがでなくなった.GJ! Enhance = 0 と Enhance が1以上のときでメニューバーの表示がグレーアウトしているときの品位が結構違うので今後の課題として取り組んでほすい gdi0038 (エンハンサの修正 SSE2 Normal) http //free.flop.jp/gdi++/src/gdi0038.lzh 164 名前:名無し~3.EXE 2006/09/28(木) 22 16 08 ID rkTHKpkV amd系のcpu使ってる人はnormalだとふつーにうごくかも (buiderscommentより) 今回は2つ作ってみました。 エンハンサの修正をとりこんでます。 sse2ディレクトリにはいってるのはicc9.1でsse2持ってるプロセッサに対して最適化してます。 normalディレクトリに入ってるのはvc8.0でふつうに最適化かけたやつです。 (付属gdi++.iniより) generalセクション 基本機能の設定をします excludeセクション 適用しないフォントを列挙してください。たぶん32フォントまで individual(仮)セクション 列挙されるときのフォント名を正確に書かないとだめっぽい スペース入ってるのはめんどいね。 ウェイトを指定するフォントを列挙してください。たぶん32フォントまで excludemoduleセクション allgdi+p.exeを使用する際にインジェクションしないプロセスを列挙してください。たぶん32プロセスまで。 gdi++20060928-enhance (バグ修正) http //khdd.net/kanou/kangae/2006/gdi++20060928-enhance.zip 67 名前:前スレ672 2006/09/28(木) 07 18 19 ID SkKHpb6+ 修正版できました。 バグが出ないことを最優先にして修正しました。 バグ「レインボーエフェクト」を修正 (ビットの並びが BGR なのを RGB と勘違いしていた) static な配列を書き換えるのをやめ、比較演算を行うようにした (そのぶん遅い) 色情報が正しく取れていない (前景色と背景色が同じ) 場合、出力色空間の制限をオフ。 Enhance の設定できる値を 0~9 に増やし、全体に弱くした。 サイズによってエッジ強調の強さを変える小細工をとりあえず停止した。 gdi0031 (gdi++ GUI) http //free.flop.jp/gdi++/src/gdi0031.lzh 58 名前:名無し~3.EXE 2006/09/28(木) 04 21 05 ID drc9K0aW 即席GUI gdi0029 (トレイ格納タイプのgdi.exe) http //free.flop.jp/gdi++/src/gdi0029.zip 45 名前:名無し~3.EXE 2006/09/28(木) 02 43 34 ID SlyLH6Ox 17 17 名前:名無し~3.EXE 2006/09/28(木) 01 07 38 ID NR4yXAMz 常駐のgdi.exeからiniの設定が出来たら素敵。 アイコンがいい感じなので、もうちょっと発展して欲しいなぁ… DLLディレクトリを開く・INIを開く・ダブルクリックで有効/無効を切り替え を追加 新規に加工したところは /***/ 555氏みたいにバージョン情報埋め込もうかとおもったけどVSEEだとリソース生成できないのよね gdi0027 (944 をベースにソースを整理してみた。) http //free.flop.jp/gdi++/src/gdi0027.zip 43 名前:555 2006/09/28(木) 02 31 14 ID VpFSBTN6 前スレ944(gdi0021) を元にソースを分割したりいろいろしてみた。 もしよければ取り入れてください。arch SSE, arch SSE2 指定のビルドも添付しました。 944(gdi0021)のソースを元にソースファイルを分割整理。 Cache, Settings をクラス化。グローバル変数 →クラスの static 変数 ってだけです。 Quality の上限、下限チェックを修正。 リソースファイルの取り込み malloc/free → new/delete[]、memcpy → ZeroMemory Makefile にリソースファイルのコンパイル、リンクを追加 Makefile に VisualC++ 8 による SSE / SSE2 最適化を追加 Intel C++ Compiler 用のソース、Makefile を分離(ICC 持ってないので未確認) make 用のバッチファイルを添付 111 名前:名無し~3.EXE 2006/09/28(木) 13 38 13 ID yQRtr3PG gdi0027のGDI++.DLL(2006/09/28 02 27)をLive2chでうごかしてみた http //free.flop.jp/gdi++/src/gdi0036.png 設定は以下のとおり。 [General] Quality=3 Weight=8 Enhance=2 MaxHeight=0 UseSubpixel=1 SubpixelDirection=0 ForceAntialiasedQuality=1 [Exclude] FixedSys Marlett メイリオ Meiryo [Individual] [ExcludeModule] 環境 PenM + Xp SP2 + RADEON X300 + 2048x1536モード gdi0025 (gdi0021+953+951+最適化) http //free.flop.jp/gdi++/src/gdi0025.lzh 40 名前:前スレ801 2006/09/28(木) 02 13 32 ID rkTHKpkV 33 もうやっちゃった・・・ 33 名前: ◆0x0D/0x20I 2006/09/28(木) 01 58 20 ID fkDxjKfA Osakaフォントスレで、へた字を移植する予定だったけど、だいたい道筋がついて、BDFエディタを作りかけて放置してあることに気づいた。最近、そっちの方がむしろ気になってる漏れがいる。 ま、そっちは置いといて、今のgdi++.dllの当面の目標は、 ・ズレ修正(結構厄介そうな悪寒) ・allgdiを仕上げて同梱 ・縦書き対応 だいたい、これくらいかな?最適化の問題は付いて回ると思う。エッジ強調やガンマ補正である程度の品質向上は望めるだろうけど、劇的な変化はちょっと難しいだろうから、今のgdi++.dllが一段落ついたら、FreeType2を使ってレンダリングする方向で逝くべきかもしれない。あくまでこれは妄想だけど('A`) 後で前スレ 944(gdi0021)と 951(gdi0023)をマージさせて頂いて、サイトにうpしておきます。 28 むしろ、たいした設定項目もないから、GUIを用意してもいいんじゃないかな。 VBで良ければパパッと作れるけど、SDKはマンドクセ('A`) 前スレ944(gdi0021)に前スレ953の再修正を加えました。 また、前スレ951(gdi0023)のスレッドローカルストレージパッチを取り込みました。 P4+SSE2, later or compatible processor向け最適化(w/PGO) お休みなさい __o_ SSE2に最適化されてるかわからないビルド 今回もPGOしました。 スレの 881(gdi0018)さんのパッチ見てこちらのビルドにもGetMsgProc()を追加しました。 ExcludeModuleセクションパッチを取り込みました。 プロファイル取ったときの設定はこんな感じです。 [General] Quality=3 Weight=1 Enhance=0 MaxHeight=0 UseSubpixel=0 SubpixelDirection=0 ForceAntialiasedQuality=1 流し読みしかしてないんだけど、enhancerで unsigned char を signed char にキャストしてる箇所があった。 いいんだろうか。 あと、勝手にソース分割しちゃいました。 分割したソースについては /src 以下をご覧ください。 不都合があればどんどん戻しちゃってください。>関係各位 gdi0023 (キャッシュ周りをマルチスレッド化) http //free.flop.jp/gdi++/src/gdi0023.zip 951 名前:名無し~3.EXE 2006/09/27(水) 23 46 43 ID A4syXu0J キャッシュ周りにTls~系を使用して複数スレッドからの非同期アクセスを可能にしました。 デュアルコア環境とかでallgdi++使ってると軽くなってるかも。 20060927版がベースなのでExcludeModuleとかはありません。 gdi0021 (最適化ビルド+いろいろ) http //free.flop.jp/gdi++/src/gdi0021.lzh 944 名前:801 2006/09/27(水) 23 30 01 ID UQWYzagB 疲れた・・ Pentium4(SSE2もち)以降用に最適化(w/PGO)しました。 784の本家ベースに、 790(gdi++20060927-enhance)さん、 833(gdi0012)さん、 881(gdi0018)さんのallgdi++.exe向けGetMsgProc()実装、 891(gdi0019)さんの[ExcludeModule]セクションパッチを取り込みました。 さらっと動作確認しただけなので、完動するかは保証しません・・・ gdi0019 (20060927版+バージョンリソース付きdll+ 730のallgdi++) http //free.flop.jp/gdi++/src/gdi0019.zip 891 名前:名無し~3.EXE 2006/09/27(水) 20 37 08 ID A4syXu0J 一応20060927版にバージョンリソース付きdllと 730のallgdi++をセットにした パッケージを作ってみますた。 746 746 名前:名無し~3.EXE 2006/09/27(水) 02 34 00 ID kdcoJI+4 743-744 http //drwatson.nobody.jp/gdi++/tray_allgdi2.zip とりあえずそこだけ直したけど、基本的に書き殴りっぱなしのとりあえず動くってゆーコードなので、人様には見せられないクオリティですし、なんだかallgdiの作者さんにも申し訳ないですが・・・ ㌧でもないです。漏れがタスクトレイ常駐にしなかった理由は、単にpcがXGAにもかかわらず既にトレイにアイコンが15個ぐらい並んでるからです。 というかこちらこそ最近出しゃばり過ぎてスマソ gdi0018 (0017+version+allgdi) http //free.flop.jp/gdi++/src/gdi0018.zip 881 名前:名無し~3.EXE 2006/09/27(水) 19 26 38 ID C9KiwGRj とりあえずallgdi適用可能になった(と思う) 869 実態は 869(gdi0017)に 654の差分を追加しただけなんで整合性が非常に妖しいです できれば理解してる方に修正してもらいたい 654 名前:名無し~3.EXE 2006/09/26(火) 22 02 26 ID BnjtjUIR http //www.uploda.org/uporg528876.zip.html pass gdi allgdi.exeを実行すると起動中の全プロセスにgdi++.dllが読み込まれる。 allgdi.exe -pで常駐モード。(終了はタスクマネージャで) 結構定期的に出てそうな要望なので試しに作ってみた。 gdi0017 (gdi0004lzh+individualセクション有効化) http //free.flop.jp/gdi++/src/gdi0017.lzh 869 名前:801 2006/09/27(水) 18 48 09 ID UQWYzagB 833(gdi0012)さんのIndividualセクション設定の部分をポーティングしてみました。 今回もSSE2+Pentium4向けに最適化してます。 とりあえずポーティングしてみたものの見やすくなってるんだろうか。。。 失敗してるかも? gdi0016 (ICC9.1にてPGO付きビルドSSE2/Pentium4向け) http //free.flop.jp/gdi++/src/gdi0016.lzh 698 名前:名無し~3.EXE 2006/09/26(火) 23 37 27 ID RFsWnBd0 今回は、SSE2+PGOでビルドしてみました。SSE2を持っているプロセッサで動くと思います。 エンハンスフィルタも取り込んでおきました [General] Quality=3 Weight=0 Enhance=1 MaxHeight=0 UseSubpixel=0 SubpixelDirection=0 ForceAntialiasedQuality=1 iniはこんな感じの設定で、firefoxで多少ブラウジングしてみただけですが どれくらい速くなったのかわかりません 最適化ビルド好きなあなたへ。 buildlog.htmは好き者用です gdi0012 (フォントごとにウェイト指定) http //free.flop.jp/gdi++/src/gdi0012.zip 833 名前:名無し~3.EXE 2006/09/27(水) 16 44 08 ID HJorFkvP MSゴシックに比べてMS明朝が薄くて困ってたので、 フォントごとにウェイト指定できるようにしてみました。 しょぼくてすまん。 最近、話題が高度でついて行けません('A`) gdi0011 (デバッグビルド) http //free.flop.jp/gdi++/src/gdi0011.lzh 829 名前:801 2006/09/27(水) 16 36 02 ID UQWYzagB 819 すでに何かのアプリがgdi++.dll使ってて上書きできないとか言う話でもないよね? とりあえず、デバッグビルドつくってみました。最適化なんぞ一切かかっていません。 すごい遅くても、これ無事に起動する? リネームしてないんで自力でgdi++.dllにしてからよろり gdi0009 (PentiumM(Banias or later)) http //free.flop.jp/gdi++/src/gdi0009.lzh 816 名前:801 2006/09/27(水) 16 21 34 ID UQWYzagB 814 ファイル壊れてるなら他の人も使えないだろうし・・・なんでだろう。 とりあえずPentiumM(baniasかそれ以降用)向けにビルドし直してみた。 PGOはプロセッサ持ってないからかけれなかったけども。 819 名前:名無し~3.EXE 2006/09/27(水) 16 24 06 ID NdJgLUsq 816 やっぱダメでごんす・・・ gdi0004 (sse2/pentium4用に最適化したもの) http //free.flop.jp/gdi++/src/gdi0004.lzh 801 名前:名無し~3.EXE 2006/09/27(水) 15 17 51 ID UQWYzagB 最適化ビルドです。784のソースに新エンハンサーをポーティングしてみました。 なんか、新エンハンサーって一定の幅以下の文字の描画の時におかしくなります? ちらしのうら const staticじゃなくてstatic constだとおもうんd /ちらしのうら 805 名前:名無し~3.EXE 2006/09/27(水) 15 59 25 ID 6BLvjhDr 801 Xp SP2 + IE7RC1では発生しないね http //free.flop.jp/gdi++/src/gdi0008.png IE7RC Enhance の設定をしても落ちないので助かったよ 808 名前:名無し~3.EXE 2006/09/27(水) 16 10 01 ID NdJgLUsq 801 PentiumMマシンでだとGDI++.DLLがロードできないと言われるんだけど 814 名前:名無し~3.EXE 2006/09/27(水) 16 19 50 ID NdJgLUsq PenitumM745(Dothan)でMMX,SSE,SSE2対応でした。 なんでだめなんだろう・・・ gdi++20060927-enhance (フィルタ修正版) http //khdd.net/kanou/kangae/2006/gdi++20060927-enhance.zip 790 名前:672 2006/09/27(水) 12 42 30 ID hbbR6JaG フィルタ修正版を作ったよ。 変更点 リンギング防止 Enhance の設定できる値を0~8に増やした。 16ピクセル超で一段階弱く、32ピクセル超でエフェクトオフ。 グレーアウトのテキストも許容範囲内になったようです。 ソースは 698 さんのバージョンを元にしました。 698 名前:名無し~3.EXE 2006/09/26(火) 23 37 27 ID RFsWnBd0 http //www.uploda.org/uporg529021.lzh.html pass gdi 今回は、SSE2+PGOでビルドしてみました。SSE2を持っているプロセッサで動くと思います。 エンハンスフィルタも取り込んでおきました。 795 名前:名無し~3.EXE 2006/09/27(水) 12 54 21 ID YoS2OVs9 790 Enhance有効だと、こんな風に色が変わります…。 http //free.flop.jp/gdi++/src/gdi0002.png アイコン icon http //free.flop.jp/gdi++/src/gdi0089.zip
https://w.atwiki.jp/vst_prog/pages/78.html
トップページ MIDIメッセージをprocessReplacing()関数中で処理する方法 前項でprocessEvents()関数によってホストアプリケーションから受け取ったMIDIメッセージをprocessReplacing()関数で処理する方法を記載する。 サンプルコード サンプルコードではロードするとノイズを生成、出力するVSTとなっている。 MIDIのコントロールチェンジメッセージ 7番(ボリュームコントロール)によって出力されるノイズのボリュームを調整している。 void MyMidiSampleVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 // midieventlistの読み込み位置int midimsg_cursol = 0; for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 // MIDIメッセージがあるか確認if ( midimsgnum 0){// MIDIメッセージを処理するタイミングかどうかを確認する。if( midimsgbuf[midimsg_cursol].deltaFrames = i){// MIDIメッセージがコントロールチェンジのボリューム変更(CC7)であった場合if( midimsgbuf[midimsg_cursol].message == 0xB0 midimsgbuf[midimsg_cursol].data1 == 7){volume = (float)( midimsgbuf[midimsg_cursol].data2) / 127.0f;} // midimsgbufからMIDIメッセージを読み出したので// 読み込み位置を進め、MIDIメッセージの数を減らすmidimsgnum--;midimsg_cursol++;}} //出力バッファへ書き込む。outL[i] = volume * (float)((rand() % 256) -128) / 255.0f;outR[i] = volume * (float)((rand() % 256) -128) / 255.0f;}} サンプルコードの解説 まず、MIDIメッセージを保存したバッファ(midimsgbuf)の読み込み位置を初期化とノイズのボリュームの初期化を行っている。(6~10行目) // midieventlistの読み込み位置 int midimsg_cursol = 0; // ノイズのボリューム static float volume = 1.0f; 次に音声処理を行うfor文の中でMIDIメッセージがあるか確認し、ある場合はMIDIメッセージを処理するタイミングかどうかを確認している。(17~34行目) // MIDIメッセージがあるか確認 if ( midimsgnum 0) { // MIDIメッセージを処理するタイミングかどうかを確認する。 if( midimsgbuf[midimsg_cursol].deltaFrames = i) { : : } } MIDIメッセージを処理するタイミングであった場合、通常はMIDIメッセージにあわせて以下のような処理を行う キーのオン、オフ処理 ピッチベンドの処理 コントロールチェンジ処理 今回はMIDIメッセージがコントロールチェンジのボリューム変更(7番)のみを処理し、ノイズのボリュームを変更する処理となっている。(22~27行目) // MIDIメッセージがコントロールチェンジのボリューム変更(CC7)であった場合 if( midimsgbuf[midimsg_cursol].message == 0xB0 midimsgbuf[midimsg_cursol].data1 == 7) { volume = (float)( midimsgbuf[midimsg_cursol].data2) / 127.0f; } MIDIメッセージを処理した場合、MIDIメッセージの数をしめすmidimsgnumを1減らし、同時にmidimsgbufの読み込み位置を1進める(31~32行目) // midimsgbufからMIDIメッセージを読み出したので // 読み込み位置を進め、MIDIメッセージの数を減らす midimsgnum--; midimsg_cursol++; 最後にノイズの生成と音声信号出力バッファへの書き込みを行っている。(37~38行目) outL[i] = volume * (float)((rand() % 256) -128) / 255.0f; outR[i] = volume * (float)((rand() % 256) -128) / 255.0f; 次へ 同一カテゴリのTips 項目 No. 概要 MIDIメッセージ処理 No.1 MIDIメッセージ処理で最小構成の自作VSTに追加する変数・関数 No.2 VSTの初期化とMIDIメッセージ処理関連の変数の初期化 No.3 ホストアプリケーションからMIDIメッセージを受け取る方法 No.4 MIDIメッセージをprocessReplacing()関数中で処理する方法 No.5 MIDIメッセージ処理で作成したVSTのサンプルソースコード全体(暫定版)
https://w.atwiki.jp/vst_prog/pages/72.html
VST Tips(準備中) 音声処理を行う関数 ここでは最初で定義したMyMinimumVSTの以下2つの関数のうち、残りの音声処理を行うprocessReplacing()関数について詳細を記載する。 コンストラクタ void processReplacing() processReplacing()関数 AudioEffectXクラスを継承して作った自作クラスは必ずprocessReplacing()関数を継承しなくてはならない。 processReplacing()関数 void processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames); processReplacing()関数の引数については以下のようになっている。 引数 説明 float** inputs 入力音声信号のバッファ。2次元配列で渡される。1次元目の大きさはコンストラクタにsetNumInputs()関数で指定したサイズ。2次元目の大きさは後述のsampleFramesとなる。書き込まれている音声信号は-1.0~+1.0の範囲 float** outputs 出力音声信号のバッファ。2次元配列で渡される。1次元目の大きさはコンストラクタでsetNumOutputs()関数に指定したサイズ。2次元目の大きさは後述のsampleFramesとなる音声信号は-1.0~+1.0の範囲で書き込まなければならない。 VstInt32 sampleFrames 入力音声信号、出力音声信号のバッファサイズ サンプルコード void MyMinimumVST processReplacing (float** inputs, float** outputs, VstInt32 sampleFrames){//入力、出力は2次元配列で渡される。//入力は-1.0f~1.0fの間で渡される。//出力は-1.0f~1.0fの間で書き込む必要がある。//sampleFramesが処理するバッファのサイズfloat* inL = inputs[0]; //入力 左用float* inR = inputs[1]; //入力 右用float* outL = outputs[0]; //出力 左用float* outR = outputs[1]; //出力 右用 for (int i = 0; i sampleFrames; i++){//ここで音声処理を行う。 //出力バッファへ書き込む。outL[i] = inL[i];outR[i] = inR[i];}} サンプルコードの解説 まず、引数のinputs、outputsは2次元配列であり、各次元のサイズはは以下のようになっている。 inputs[チャンネル数][sampleFrames] outputs[チャンネル数][sampleFrames] 上記引数をわかりやすいよう、3~12行目で入力音声信号・出力音声信号ともにチャンネルごとに別の変数へ代入している。(この処理は必須ではない。) また、入力音声信号、出力音声信号がモノラルの場合は左用のみとなる。 float* inL = inputs[0]; //入力 左用 float* inR = inputs[1]; //入力 右用 float* outL = outputs[0]; //出力 左用 float* outR = outputs[1]; //出力 右用 次に、出力音声信号をoutputsに代入するため、sampleFrames分処理するループを作成する。 for (int i = 0; i sampleFrames; i++) { //ここで音声処理を行う。 } 最後に、上記のループ内で出力音声信号バッファに書き込みを行っている。 今回は入力音声信号をそのまま出力音声信号バッファに書き込んでいる。 //出力バッファへ書き込む。 outL[i] = inL[i]; outR[i] = inR[i]; 次へ 同一カテゴリのTips 項目 No. 概要 最小構成のVST No.1 最小構成の自作VSTに必要な関数等の説明。 No.2 最小構成の自作VSTの必須初期化項目について No.3 最小構成の自作VSTの音声処理関数について No.4 最小構成の自作VSTのサンプルソースコード全体
https://w.atwiki.jp/vst_prog/pages/59.html
VST Tips(準備中) プロジェクトへのVST SDKファイル追加 VSTを作るうえで必要なVST SDKのCPPファイルをプロジェクトに追加する。 プロジェクトに必要なVST SDKのCPPファイルは以下のとおりである。 audioeffect.cpp audioeffectx.cpp vstplugmain.cpp 既存の項目の追加 画面右側のソリューションエクスプローラで「リソースファイル」を選択し、右クリックを押す。 開いたポップアップメニューで「追加」→「既存の項目」を選択する。 追加するファイルの選択 vstsdk2.4\public.sdk\source\vst2.xの配下にある以下3つのファイルを選択し、「追加」を押す。 audioeffect.cpp audioeffectx.cpp vstplugmain.cpp 「リソースファイル」の配下に3つのファイルが追加されれば完了。 次へ 同一カテゴリのTips 項目 No. 概要 VC++ プロジェクトの準備 No.1 VC++でVST用のプロジェクトを作成する No.2 VSTを作成するに当たって必要なVST SDKファイルをVC++のプロジェクトに追加する No.3 VSTを作成するに当たって必要なvstplug.defファイルを作成する No.4 VSTを作成するに当たって必要なコンパイラ、リンカ設定を追加する No.5 VSTをコンパイルするの際の注意事項